package com.feihao.zhou.demo01;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectGetMethod {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {
//        Class<?> clazz = Class.forName("com.feihao.zhou.demo01.Student");
//
////        Method method = clazz.getMethod("getString");// 私有方法*/
//
//        Method method = clazz.getDeclaredMethod("getString");
//        System.out.println(method);
//
//
//        Method[] methods = clazz.getMethods();
//        for (Method method1 : methods) {
//            System.out.println(method1);
//        }
//        System.out.println("-------分割-------");
//
//        Method getNumber = clazz.getMethod("getNumber", int.class);
//        System.out.println(getNumber);
//
//
//        System.out.println("-------分割-------");
//        Method[] declaredMethods = clazz.getDeclaredMethods();
//        for (Method declaredMethod : declaredMethods) {   //本类中所有方法,不包含继承的方法
//            System.out.println(declaredMethod);
//        }

        //获取Class对象：
        Class<?> clazz = Class.forName("com.feihao.zhou.demo01.Student");

        //获取所有的方法，返回一个数组：
        Method[] methods = clazz.getMethods();
        for (Method method : methods) {    //所有非私有方法，包括继承父类的
            System.out.println(method);
        }


        //获取所有本类的方法：
        Method[] declaredMethods = clazz.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("本类中的:"+declaredMethod);
        }

        //获取某个名字的方法：无参有返回：
        Method getString = clazz.getDeclaredMethod("getString");
        //创建对象并调用：
        Object o = clazz.newInstance();
        getString.setAccessible(true);//取消安全检查
        Object invoke = getString.invoke(o);
        System.out.println(invoke);

        Method getNumber = clazz.getDeclaredMethod("getNumber", int.class);
        getNumber.setAccessible(true);
        Object o1 = clazz.newInstance();
        Object invoke1 = getNumber.invoke(o1, 778899);
        System.out.println("返回值：" + invoke1);
    }
}
